home *** CD-ROM | disk | FTP | other *** search
- PROGRAM solve;
- {
- This program solves a maze generated by the program EMAZE.PAS.
- It prints the solution on an Epson MX-80 printer.
-
- Written by James L. Dean
- 406 40th Street
- New Orleans, LA 70124
- }
- CONST
- num_columns = 95;
- x_max = 190; {2*num_columns}
- num_rows = 120;
- y_max = 240; {2*num_rows}
- TYPE
- stack_rec_ptr = ^stack_rec;
- stack_rec = RECORD
- index_1 : BYTE;
- index_2 : BYTE;
- next_ptr : stack_rec_ptr
- END;
- VAR
- column : INTEGER;
- column_mod_2 : INTEGER;
- column_mod_5 : INTEGER;
- delta_index_1 : INTEGER;
- delta_index_1a : INTEGER;
- delta_index_1b : INTEGER;
- delta_index_1c : INTEGER;
- delta_index_1d : INTEGER;
- delta_index_2 : INTEGER;
- delta_x : ARRAY [1..4,1..24] OF INTEGER;
- delta_y : ARRAY [1..4,1..24] OF INTEGER;
- page : ARRAY [0..y_max,0..x_max] OF CHAR;
- passage_found : BOOLEAN;
- power_of_two : INTEGER;
- print_line : ARRAY[0..479] OF BYTE;
- r_n : ARRAY [1..8] OF INTEGER;
- r_n_index_1 : INTEGER;
- r_n_index_2 : INTEGER;
- response : CHAR;
- row_mod_2 : INTEGER;
- row_mod_6 : INTEGER;
- seed : STRING[8];
- stack_head : stack_rec_ptr;
- stack_ptr : stack_rec_ptr;
- tem_int : INTEGER;
- x : INTEGER;
- x_next : INTEGER;
- x_out : INTEGER;
- x_previous : INTEGER;
- x_wall_1 : INTEGER;
- y : INTEGER;
- y_next : INTEGER;
- y_previous : INTEGER;
- y_out : INTEGER;
- y_wall_1 : INTEGER;
- BEGIN
- ClrScr;
- WRITELN(OUTPUT,' Maze Solver');
- WRITELN(OUTPUT,' '); WRITELN(OUTPUT,' '); WRITELN(OUTPUT,' ');
- WRITE(OUTPUT,'Seed? ');
- READLN(INPUT,seed);
- WHILE (Length(seed) < 8) DO seed:=CONCAT('0',seed);
- WRITELN(OUTPUT,' ');
- WRITELN(OUTPUT,'Generating maze...');
- delta_x[1,1]:=-1;
- delta_y[1,1]:=0;
- delta_x[2,1]:=0;
- delta_y[2,1]:=1;
- delta_x[3,1]:=1;
- delta_y[3,1]:=0;
- delta_x[4,1]:=0;
- delta_y[4,1]:=-1;
- delta_index_2:=0;
- FOR delta_index_1a:=1 TO 4 DO
- FOR delta_index_1b:=1 TO 4 DO
- IF delta_index_1a <> delta_index_1b THEN
- FOR delta_index_1c:=1 TO 4 DO
- IF ((delta_index_1a <> delta_index_1c)
- AND (delta_index_1b <> delta_index_1c)) THEN
- FOR delta_index_1d:=1 TO 4 DO
- IF ((delta_index_1a <> delta_index_1d)
- AND (delta_index_1b <> delta_index_1d)
- AND (delta_index_1c <> delta_index_1d)) THEN
- BEGIN
- delta_index_2:=delta_index_2+1;
- delta_x[delta_index_1a,delta_index_2]:=delta_x[1,1];
- delta_y[delta_index_1a,delta_index_2]:=delta_y[1,1];
- delta_x[delta_index_1b,delta_index_2]:=delta_x[2,1];
- delta_y[delta_index_1b,delta_index_2]:=delta_y[2,1];
- delta_x[delta_index_1c,delta_index_2]:=delta_x[3,1];
- delta_y[delta_index_1c,delta_index_2]:=delta_y[3,1];
- delta_x[delta_index_1d,delta_index_2]:=delta_x[4,1];
- delta_y[delta_index_1d,delta_index_2]:=delta_y[4,1]
- END;
- FOR r_n_index_1:=1 TO 8 DO
- BEGIN
- tem_int:=ORD(seed[r_n_index_1]);
- WHILE (tem_int > 29) DO tem_int:=tem_int-29;
- IF tem_int = 0 THEN tem_int:=1;
- r_n[r_n_index_1]:=tem_int
- END;
- FOR x_out:=0 TO x_max DO
- FOR y_out:=0 TO y_max DO
- page[y_out,x_out]:='W';
- IF ODD(num_columns) THEN
- x:=num_columns
- ELSE
- x:=(num_columns-1);
- IF ODD(num_rows) THEN
- y:=num_rows
- ELSE
- y:=(num_rows-1);
- page[y,x]:=' ';
- stack_head:=NIL;
- REPEAT
- delta_index_1:=1;
- REPEAT
- delta_index_2:=r_n[1];
- r_n_index_1:=1;
- FOR r_n_index_2:=2 TO 8 DO
- BEGIN
- tem_int:=r_n[r_n_index_2];
- r_n[r_n_index_1]:=tem_int;
- delta_index_2:=delta_index_2+tem_int;
- IF delta_index_2 > 29 THEN
- delta_index_2:=delta_index_2-29;
- r_n_index_1:=r_n_index_2
- END;
- r_n[8]:=delta_index_2
- UNTIL
- (delta_index_2 <= 24);
- passage_found:=FALSE;
- REPEAT
- WHILE ((delta_index_1 <= 4) AND (NOT passage_found)) DO
- BEGIN
- x_next:=x+2*delta_x[delta_index_1,delta_index_2];
- IF x_next <= 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF x_next >= x_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- BEGIN
- y_next:=y+2*delta_y[delta_index_1,delta_index_2];
- IF y_next <= 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF y_next >= y_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF page[y_next,x_next] = 'W' THEN
- passage_found:=TRUE
- ELSE
- delta_index_1:=delta_index_1+1
- END
- END;
- IF (NOT passage_found) THEN
- BEGIN
- delta_index_1:=stack_head^.index_1;
- delta_index_2:=stack_head^.index_2;
- x:=x-2*delta_x[delta_index_1,delta_index_2];
- y:=y-2*delta_y[delta_index_1,delta_index_2];
- stack_ptr:=stack_head;
- stack_head:=stack_head^.next_ptr;
- DISPOSE(stack_ptr);
- delta_index_1:=delta_index_1+1
- END
- UNTIL ((passage_found) OR (stack_head = NIL));
- IF passage_found THEN
- BEGIN
- NEW(stack_ptr);
- stack_ptr^.next_ptr:=stack_head;
- stack_head:=stack_ptr;
- stack_head^.index_1:=delta_index_1;
- stack_head^.index_2:=delta_index_2;
- page[y_next,x_next]:=' ';
- IF x = x_next THEN
- BEGIN
- y_wall_1:=(y+y_next) DIV 2;
- page[y_wall_1,x_next]:=' '
- END
- ELSE
- BEGIN
- x_wall_1:=(x+x_next) DIV 2;
- page[y_next,x_wall_1]:=' '
- END;
- x:=x_next;
- y:=y_next
- END
- UNTIL (stack_head = NIL);
- page[0,1]:=' ';
- page[y_max,x_max-1]:=' ';
- WRITELN(OUTPUT,' ');
- WRITELN(OUTPUT,'Solving maze...');
- x:=1;
- y:=1;
- x_previous:=x;
- y_previous:=-y;
- FOR y_out:=0 TO y DO
- page[y_out,x]:='S';
- REPEAT
- delta_index_1:=1;
- passage_found:=FALSE;
- REPEAT
- WHILE ((delta_index_1 <= 4) AND (NOT passage_found)) DO
- BEGIN
- x_next:=x+delta_x[delta_index_1,1];
- y_next:=y+delta_y[delta_index_1,1];
- IF page[y_next,x_next] = ' ' THEN
- passage_found:=TRUE
- ELSE
- delta_index_1:=delta_index_1+1
- END;
- IF (NOT passage_found) THEN
- BEGIN
- delta_index_1:=stack_head^.index_1;
- x_previous:=x-2*delta_x[delta_index_1,1];
- y_previous:=y-2*delta_y[delta_index_1,1];
- IF x = x_previous THEN
- IF y <= y_previous THEN
- FOR y_out:=y TO y_previous DO
- page[y_out,x]:=' '
- ELSE
- FOR y_out:=y_previous TO y DO
- page[y_out,x]:=' '
- ELSE
- IF x <= x_previous THEN
- FOR x_out:=x TO x_previous DO
- page[y,x_out]:=' '
- ELSE
- FOR x_out:=x_previous TO x DO
- page[y,x_out]:=' ';
- x:=x_previous;
- y:=y_previous;
- stack_ptr:=stack_head;
- stack_head:=stack_head^.next_ptr;
- DISPOSE(stack_ptr);
- delta_index_1:=delta_index_1+1
- END
- UNTIL (passage_found);
- x_next:=x_next+delta_x[delta_index_1,1];
- y_next:=y_next+delta_y[delta_index_1,1];
- IF y_next <= y_max THEN
- BEGIN
- NEW(stack_ptr);
- stack_ptr^.next_ptr:=stack_head;
- stack_head:=stack_ptr;
- stack_head^.index_1:=delta_index_1;
- IF x = x_next THEN
- IF y <= y_next THEN
- FOR y_out:=y TO y_next DO
- page[y_out,x]:='S'
- ELSE
- FOR y_out:=y_next TO y DO
- page[y_out,x]:='S'
- ELSE
- IF x <= x_next THEN
- FOR x_out:=x TO x_next DO
- page[y,x_out]:='S'
- ELSE
- FOR x_out:=x_next TO x DO
- page[y,x_out]:='S';
- x:=x_next;
- y:=y_next
- END
- UNTIL (y_next > y_max);
- FOR y_out:=y TO y_max DO
- page[y_out,x]:='S';
- WHILE (stack_head <> NIL) DO
- BEGIN
- stack_ptr:=stack_head;
- stack_head:=stack_head^.next_ptr;
- DISPOSE(stack_ptr)
- END;
- WRITELN(OUTPUT,' ');
- WRITELN(OUTPUT,'Position your paper at top of form and press RETURN.');
- READLN(INPUT,response);
- WRITELN(OUTPUT,'Outputting solution...');
- WRITE(LST,CHR(27)); WRITE(LST,'A'); WRITE(LST,CHR(8));
- WRITE(LST,CHR(27),'2');
- power_of_two:=128;
- FOR column:=0 TO 479 DO
- print_line[column]:=0;
- row_mod_2:=0;
- row_mod_6:=0;
- y_out:=0;
- WHILE (y_out <= y_max) DO
- BEGIN
- column:=0;
- column_mod_2:=0;
- column_mod_5:=0;
- x_out:=0;
- WHILE (x_out <= x_max) DO
- BEGIN
- IF page[y_out,x_out] = 'W' THEN
- print_line[column]:=print_line[column]+power_of_two
- ELSE
- BEGIN
- IF row_mod_2 = 0 THEN
- BEGIN
- IF column_mod_2 = 0 THEN
- BEGIN
- IF page[y_out,x_out] = 'S' THEN
- BEGIN
- print_line[column]:=print_line[column]+power_of_two
- END
- END
- END
- END;
- IF column_mod_5 = 0 THEN
- x_out:=x_out+1;
- column:=column+1;
- column_mod_2:=column_mod_2+1;
- IF column_mod_2 >= 2 THEN
- column_mod_2:=0;
- column_mod_5:=column_mod_5+1;
- IF column_mod_5 >= 5 THEN
- BEGIN
- column_mod_5:=0;
- x_out:=x_out+1
- END
- END;
- power_of_two:=power_of_two DIV 2;
- IF power_of_two = 0 THEN
- BEGIN
- WRITE(LST,CHR(27)); WRITE(LST,'K');
- WRITE(LST,CHR(224)); WRITE(LST,CHR(1));
- power_of_two:=128;
- FOR column:=0 TO 479 DO
- BEGIN
- WRITE(LST,CHR(print_line[column]));
- print_line[column]:=0
- END
- END;
- IF row_mod_6 = 0 THEN
- y_out:=y_out+1;
- row_mod_2:=row_mod_2+1;
- IF row_mod_2 >= 2 THEN
- row_mod_2:=0;
- row_mod_6:=row_mod_6+1;
- IF row_mod_6 >= 6 THEN
- BEGIN
- row_mod_6:=0;
- y_out:=y_out+1
- END
- END;
- WRITE(LST,CHR(27)); WRITE(LST,'K');
- WRITE(LST,CHR(224)); WRITE(LST,CHR(1));
- FOR column:=0 TO 479 DO
- WRITE(LST,CHR(print_line[column]));
- WRITE(LST,CHR(27)); WRITE(LST,'A',CHR(12),CHR(27),'2');
- WRITELN(LST,' ');
- WRITE(LST,'Seed: '); WRITELN(LST,SEED);
- WRITE(LST,CHR(12));
- WRITE(LST,CHR(12))
- END.